﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web.Mvc;
using eCRAM.Bll;
using eCRAM.Model;
using eCRAM.Tools;

namespace eCRAM.WebSite.Tools
{
    public static class ViewDataTools
    {
        /// <summary>
        /// Obtient une liste de SelectListItem composée de la liste des mois
        /// </summary>
        /// <param name="viewData"></param>
        /// <returns></returns>
        public static IEnumerable<SelectListItem> GetMonthList(this ViewDataDictionary viewData)
        {
            var i = 0;
            return CultureInfo.CurrentCulture.DateTimeFormat.MonthNames
                .Take(12)
                .Select(month => new SelectListItem { Text = month.Capitalize(), Value = (++i).ToString() });
        }

        /// <summary>
        /// Obtient une liste de SelectListItem composée de la liste des années
        /// </summary>
        /// <param name="viewData"></param>
        /// <returns></returns>
        public static IEnumerable<SelectListItem> GetYearList(this ViewDataDictionary viewData)
        {
            var ret = new List<SelectListItem>();
            var currentYear = DateTime.Now.Year;
            for (var j = currentYear - OutilsConfiguration.YearRange; j <= currentYear + OutilsConfiguration.YearRange; j++)
            {
                var item = new SelectListItem { Value = j.ToString(), Text = j.ToString() };
                ret.Add(item);
            }

            return ret;
        }

        /// <summary>
        /// Obtient une liste de SelectListItem composée de la liste des statuts d'un cram
        /// </summary>
        /// <param name="viewData"></param>
        /// <returns></returns>
        public static IEnumerable<SelectListItem> GetCramStatusList(this ViewDataDictionary viewData)
        {
            return Enum.GetValues(typeof(CramStatus))
                .OfType<CramStatus>()
                .Select(val => new SelectListItem { Text = val.GetLabel(), Value = ((int)val).ToString() });
        }

        /// <summary>
        /// Obtient une liste de SelectListItem composée de la liste des roles des utilisateurs
        /// </summary>
        /// <param name="viewData"></param>
        /// <returns></returns>
        public static IEnumerable<SelectListItem> GetUserRoleList(this ViewDataDictionary viewData)
        {
            return Enum.GetValues(typeof(UserRole))
                .OfType<UserRole>()
                .Select(val => new SelectListItem { Text = val.GetLabel(), Value = ((int)val).ToString() });
        }

        /// <summary>
        /// Obtient une liste de SelectListItem composée de la liste des utilisateurs
        /// </summary>
        /// <param name="viewData"></param>
        /// <returns></returns>
        public static IEnumerable<SelectListItem> GetUsersList(this ViewDataDictionary viewData)
        {
            return UserManager.GetAll()
                .Where(u => u.IsActive)
                .OrderBy(u => u.LastName).ThenBy(u => u.FirstName)
                .Select(item => new SelectListItem { Text = string.Format("{0} {1}", item.LastName.ToUpper(), item.FirstName), Value = item.Id.ToString() });
        }

        /// <summary>
        /// Obtient une liste de SelectListItem composée de la liste des activites
        /// </summary>
        /// <param name="viewData"></param>
        /// <returns></returns>
        public static IEnumerable<SelectListItem> GetActivityList(this ViewDataDictionary viewData)
        {
            return ActivityManager.GetAll().Select(item => new SelectListItem { Text = item.Name, Value = item.Id.ToString() });
        }


        /// <summary>
        /// Obtient une liste de SelectListItem composée de la liste des activites associées un utilisateur
        /// </summary>
        /// <param name="viewData"></param>
        /// <param name="idUser"></param>
        /// <returns></returns>
        public static IEnumerable<SelectListItem> GetUserActivityList(this ViewDataDictionary viewData, Guid idUser)
        {
            return ActivityManager.GetUserActivityList(idUser)
                .Where(a => a.IsActive)
                .Select(item => new SelectListItem { Text = item.Name, Value = item.Id.ToString() });
        }

        public static IEnumerable<SelectListItem> GetRestrictedActivityList(this ViewDataDictionary viewData, Guid idUser)
        {
            return ActivityManager.GetRestrictedActivityList(idUser)
                .Select(item => new SelectListItem { Text = item.Name, Value = item.Id.ToString() });
        }

        /// <summary>
        /// Obtient une liste de SelectListItem composée de la liste des activites disponible pour un utilisateur ainsi que le congés
        /// </summary>
        /// <param name="viewData"></param>
        /// <param name="idUser"></param>
        /// <returns></returns>
        public static IEnumerable<SelectListItem> GetAvailableUserActivityListAndHolidays(this ViewDataDictionary viewData, Guid idUser)
        {
            

            return ActivityManager.GetAvailableUserActivityListAndHolidays(idUser)
                .Select(item => new SelectListItem { Text = item.Name, Value = item.Id.ToString() });
        }


        /// <summary>
        /// Obtient une liste de SelectListItem composée de la liste des activites disponible pour un utilisateur
        /// </summary>
        /// <param name="viewData"></param>
        /// <param name="idUser"></param>
        /// <returns></returns>
        public static IEnumerable<SelectListItem> GetAvailableUserActivityList(this ViewDataDictionary viewData, Guid idUser)
        {
            return ActivityManager.GetAvailableUserActivityList(idUser)
                .Select(item => new SelectListItem { Text = item.Name, Value = item.Id.ToString() });
        }

        /// <summary>
        /// Obtient une liste de SelectListItem composée de la liste des pièces jointes disponible pour un Cram
        /// </summary>
        /// <param name="viewData"></param>
        /// <param name="cramId"></param>
        /// <returns></returns>
        public static IEnumerable<SelectListItem> GetCramAttachmentList(this ViewDataDictionary viewData, Guid cramId)
        {
            return CramManager.GetCramAttachmentsByCramId(cramId)
                .Select(item => new SelectListItem { Text = item.AttachmentName, Value = item.Id.ToString() });
        }


        /// <summary>
        /// Obtient une liste de SelectListItem composée de la liste des congés 
        /// </summary>
        /// <param name="viewData"></param>
        /// <returns></returns>
        public static IEnumerable<SelectListItem> GetHolidaysActivityList(this ViewDataDictionary viewData)
        {
            return ActivityManager.GetAll().Where(x => x.ActivityType.IsHoliday)
                .Select(item => new SelectListItem { Text = item.Name, Value = item.Id.ToString() });
        }

        /// <summary>
        /// Obtient une liste de SelectListItem composée de la liste des activites autres que les congés
        /// </summary>
        /// <param name="viewData"></param>
        /// <returns></returns>
        public static IEnumerable<SelectListItem> GetNotHolidaysActivityList(this ViewDataDictionary viewData)
        {
            return ActivityManager.GetAll().Where(x => !x.ActivityType.IsHoliday)
                .Select(item => new SelectListItem { Text = item.Name, Value = item.Id.ToString() });
        }

        /// <summary>
        /// Obtient une liste de SelectListItem composée de la liste des congés 
        /// </summary>
        /// <param name="viewData"></param>
        /// <returns></returns>
        public static IEnumerable<SelectListItem> GetAstreintesActivityList(this ViewDataDictionary viewData)
        {
            return ActivityManager.GetAll().Where(x => x.IsAstreinte)
                .Select(item => new SelectListItem { Text = item.Name, Value = item.Id.ToString() });
        }


        /// <summary>
        /// Ajoute un élément vide en debut de liste
        /// </summary>
        /// <param name="selectListItems"></param>
        /// <returns></returns>
        public static IEnumerable<SelectListItem> AddEmptyListItem(this IEnumerable<SelectListItem> selectListItems)
        {
            return (new List<SelectListItem> { new SelectListItem() }).Concat(selectListItems);
        }

        public static IEnumerable<SelectListItem> GetEnumerableListItem(this ViewDataDictionary viewData ,IEnumerable<NameValue> items) 
        {
            return items.Select(item => new SelectListItem {Text = item.Name, Value = item.Value.ToString()});
        }

        public static IEnumerable<SelectListItem> GetEnumListItem<T>(this ViewDataDictionary viewData)
        {
            var list = new List<SelectListItem>();
            foreach(var o in Enum.GetValues(typeof(T)))
            {
                list.Add(new SelectListItem
                             {
                                 Text = ((Enum) o).GetLabel(),
                                 Value = ((int) o).ToString(),
                             });
            }
            return list;
        }


        /// <summary>
        /// Obtient une collection ordonnée des libellées des jours en fonction du mois et de l'année
        /// </summary>
        /// <param name="viewData"></param>
        /// <param name="year"></param>
        /// <param name="month"></param>
        /// <returns></returns>
        public static IEnumerable<char> GetDaysByMonth(this ViewDataDictionary viewData, int year, int month)
        {
            var firstDay = new DateTime(year, month, 1);

            var days = CultureInfo.CurrentCulture.DateTimeFormat.AbbreviatedDayNames.Select(s => s.ToUpper()[0]);

            var stack = new CircularStack<char>(days);
            stack.SetIndex((int) firstDay.DayOfWeek);
            for(var i = 0; i < firstDay.AddMonths(1).AddDays(-1).Day; i++)
            {
                yield return stack.GetNextItem();
            }
        }
    }

   


}